import GObject from 'gi://GObject';
import {QuickSlider, SystemIndicator} from '../quickSettings.js';
+import * as Main from '../main.js';
+
+const BRIGHTNESS_NAME = _('Brightness');
const BrightnessItem = GObject.registerClass(
class BrightnessItem extends QuickSlider {
iconName: 'display-brightness-symbolic',
});
- this.slider.accessible_name = _('Brightness');
-
- const monitorManager = global.backend.get_monitor_manager();
- monitorManager.connectObject('monitors-changed',
- this._monitorsChanged.bind(this), this);
- this._monitorsChanged();
-
- this._sliderChangedId = this.slider.connect('notify::value',
- this._sliderChanged.bind(this));
- }
-
- _sliderChanged() {
- this._setBrightness(this.slider.value);
- }
+ this.slider.accessible_name = BRIGHTNESS_NAME;
- _changeSlider(value) {
- this.slider.block_signal_handler(this._sliderChangedId);
- this.slider.value = value;
- this.slider.unblock_signal_handler(this._sliderChangedId);
+ this._manager = Main.brightnessManager;
+ this._manager.connectObject('changed',
+ this._sync.bind(this), this);
+ this._sync();
}
- _setBrightness(brightness) {
- this._primaryBacklight?.block_signal_handler(this._brightnessChangedId);
- this._monitors.forEach(monitor => {
- const backlight = monitor.get_backlight();
- const {brightnessMin: min, brightnessMax: max} = backlight;
- backlight.brightness = min + ((max - min) * brightness);
+ _sync() {
+ const {globalScale} = this._manager;
+ this.set({
+ visible: !!globalScale,
});
- this._primaryBacklight?.unblock_signal_handler(this._brightnessChangedId);
- this._changeSlider(brightness);
- }
+ if (!this.visible)
+ return;
- _primaryBacklightChanged() {
- const {brightness, brightnessMin: min, brightnessMax: max} =
- this._primaryBacklight;
- const target = (brightness - min) / (max - min);
- this._setBrightness(target);
+ this._connectSlider(this.slider, globalScale);
}
- _setPrimaryBacklight(backlight) {
- if (this._primaryBacklight) {
- this._primaryBacklight.disconnect(this._brightnessChangedId);
- this._brightnessChangedId = 0;
- }
-
- this._primaryBacklight = backlight;
- this.visible = !!backlight;
-
- if (this._primaryBacklight) {
- this._brightnessChangedId =
- this._primaryBacklight.connect('notify::brightness',
- this._primaryBacklightChanged.bind(this));
- this._primaryBacklightChanged();
- }
- }
+ _connectSlider(slider, scale) {
+ slider.disconnectObject(scale);
+ slider.connectObject('notify::value', () => {
+ if (slider._blockBrightnessAdjust)
+ return;
+ scale.value = slider.value;
+ }, scale);
- _monitorsChanged() {
- this._monitors = global.backend.get_monitor_manager()
- .get_monitors()
- .filter(m => m.get_backlight() && m.is_active());
- const primary = this._monitors.find(m => m.is_primary()) ||
- this._monitors[0];
- this._setPrimaryBacklight(primary?.get_backlight());
+ const changeBrightness = () => {
+ slider._blockBrightnessAdjust = true;
+ slider.value = scale.value;
+ slider._blockBrightnessAdjust = false;
+ };
+ scale.connectObject('notify::value', changeBrightness, slider);
+ changeBrightness();
}
});